5074
18717
Luettelon Web-palvelun yhteystietoja ja näytän sen yhteystietojen 'osioidussa' tableView-näytössä kuvakaappauksessa näkyvällä tavalla.
Ongelma on, että saan samat tagiarvot ensimmäisen rivin valintaruuduille sekä osastolle A että osalle S. Olen lajitellut yhden taulukon ja esittänyt indeksoidun taulukon näkymän. Kuinka saada erilaisia ​​tagiarvoja indexPath.row-koodista riippuen näytettyjen osioiden lukumäärästä. Tässä yritin
SolussaForRowAtIndexPath:
UIButton * checkBox;
jos (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone)
{
checkBox = [[UIButton allokointi] initWithFrame: CGRectMake (7, 8, 30, 30)];
}
muu
{
checkBox = [[UIButton allokointi] initWithFrame: CGRectMake (15, 13, 30, 30)];
}
// int cnt = 0;
// for (int i = indexPath.section - 1; i> 0; i--)
// {
// cnt + = [[objectForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachtersilla on merkit "A" - "Z"
//}
//checkBox.tag = cnt + indexPath.row;
[checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal];
[checkBox addTarget: self action: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
paluukenno;
}
- (void) checkBoxClicked: (id) lähettäjä
{
CGPoint buttonPosition = [lähettäjä convertPoint: CGPointZero toView: self.tableViewContact];
NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition];
UIButton * tappedButton = (UIButton *) lähettäjä;
NSLog (@ "Tunnisteen numero =% d", [lähettäjän tunniste]);
if ([napautettuButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]])
{
[lähettäjä setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal];
jos (indexPath! = Nolla)
{
NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // tallenna valintaruutujen tunnukset mutableArrayOfIds-tiedostoon
NSLog (@ "Tunnistettu tarkistettu painikkeen tunnus =% @", finalIntId);
[arrayOfIds addObject: finalIntId];
}
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: napautettuButton.tag];
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row];
}
muu
{
[lähettäjä setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal];
NSLog (@ "Ei tarkastettu");
// [arrayOfIds removeObjectAtIndex: napautettuButton.tag];
}
}
- (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) -osio {
jos ([arrayOfCharacters count] == ​​0)
{
paluu @ "";
}
return [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: jakso]];
}
- (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView
{
NSArray * toBeReturned = [NSArray arrayWithArray:
[@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # "
componentsSeparatedByString: @ "|"]];
paluuBeReturned;
}
- (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) otsikko atIndex: (NSInteger) -indeksi
{
NSI-kokonaisluku = 0;
for (NSString * merkki arrayOfCharactersissa) {
if ([merkki onEqualToString: otsikko]) {
paluumäärä;
}
laskea ++;
}
paluu 0;
}
- (NSInteger) numeroOfSectionsInTableView: (UITableView *) tableView
{
return [arrayOfCharacters count];
// palauttaa 1;
}
- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) -osio
{
// return [mutableArray count];
return [[objectForCharacters objectForKey: [arrayOfCharacters objectAtIndex: jakso]] count];
} 
asetat saman tagiarvon kaikille osille, joilla on sama rivi.
IndexPathilla on kaksi ominaisuutta, {section, row}.
Sanotaan, että osassa A on kaksi riviä,
riville1 -> indexPath.section = 0, indexPath.row = 0;
riville2-> indexPath.section = 0, indexPath.row = 1;
Sanotaan, että osiossa S on kaksi riviä,
riville1 -> indexPath.section = 1, indexPath.row = 0;
riville2-> indexPath.section = 1, indexPath.row = 1;
Joten, määrität osan A riville 1 ja osan S riville 1 saman tagiarvon, joka on 0. On ongelmaasi.
Yritä asettaa tagin arvo kuten alla.
button.tag = indexPath.section * 1000 + indexPath.row;
kun haet osiota ja riviä,
NSIegeger -osio = (button.tag) / 1000;
NSI kokonaislukurivi = (button.tag)% 1000;
|
Kokeile tätä...
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
staattinen NSString * CellIdentifier = @ "solu";
UITableViewCell * solu = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
jos (solu == nolla) {
solu = [[UITableViewCell-varaus] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier];
}
UIButton * checkBox = [[UIButton allokointi] initWithFrame: CGRectMake (280, 10, 50, 44)];
checkBox.backgroundColor = [UIColor orangeColor];
[checkBox addTarget: self action: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
paluukenno;
}
- (void) checkBoxClicked: (id) lähettäjän tapahtuma: (id) tapahtuma
{
NSSet * koskettaa = [tapahtuma allTouches];
UITouch * touch = [koskettaa mitä tahansa kohdetta];
CGPoint currentTouchPosition = [kosketussijaintiInView: self.tv]; // tässä tv on TableView-objekti
NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition];
NSLog (@ "indePath.section% d: n arvo, indexPath.row% d", indexPath.section, indexPath.row);
}
|
Tämä tapahtuu, koska määrität tagin painikkeille INDEPENDENT osioista.
Molemmissa osioiden ensimmäisessä rivissä A & S on rivi = 0. Joten niiden painikkeille on määritetty tagi 0. Sinun tulisi antaa heille Pidä viittaus osioihisi.
ehdotan esteettömyysvinkin määrittämistä pilkuilla erotetulla lomakkeella, joka sisältää osion, rivin.
Ja omassa menetelmässäsi
- (void) checkBoxClicked: (id) lähettäjä
{
// poimi merkkijono pilkuilla erotetusta muodosta. 1. on osa, toinen on rivi.
}
Toinen vaihtoehto on tehdä mitä ikinä teet ja toteuttaa Button-menetelmäsi näin.
CGPoint buttonPosition = [lähettäjä convertPoint: CGPointZero toView: self.tableView];
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition];
jos (indexPath! = nolla)
{
... indexpath.section on sinun osasi, index path.row on rivisi.
}
On myös kolmas vaihtoehto.
Määritä painikkeellesi cellforRowAtIndexpath-otsikossa otsikko
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
[btn setTitle: <# Rivi #> forState: UIControlStateDisabled];
[btn setTag <#Osa osasi #>];
joten kun vastaanotat painikkeella, sinulla voi olla sekä osio (tunniste) että rivi (otsikko vammaisille).
- (void) checkBoxClicked: (id) lähettäjä [[button titleForState: UIControlStateDisabled]; // rivisi
button.tag // osastosi}
|
Kokeile tätä!
Jokainen osa, jonka saatat tuntea oikean osan määrän, lisää sitten yksittäisten rivien määrä.
[[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row
Where fieldTitlesList on osastojesi taulukko.
|
Lisäsin seuraavan koodin, joka ratkaisi ongelmani
NSIegerer rowNumber = 0;
varten (NSInteger i = 0; i